<?php

/* Form Criar Bolão para Administradores */

class Administrador_Form_CriarBolao extends Zend_Form
{

    private $_campeonatoSeletor;
    private $_valorCampeonato;
    private $_jogoSeletor;
    private $_eImportanteCheckBox;
    private $_novoBolaoBotao;
    private $_campeonatoMapper;
    private $_jogoMapper;
    //apenas um flag para a msg de erro de jogos inexistentes não aparecer mais
    //de uma vez.
    private $_msgErroJogos;

    //Construtor:
    public function __construct(Application_Model_CampeonatoMapper $campeonato,
                                Application_Model_JogoMapper $jogo,
                                $post = null, $options = null)
    {
        $this->_campeonatoMapper = $campeonato;
        $this->_jogoMapper = $jogo;

        parent::__construct($options);

        //usando a GAMBIARRA MODE:
        if (isset($post) && is_array($post))
        {
            $this->prepararCamposExtras($post);
        }
    }

    //Init:
    public function init()
    {
        $this->setMethod('post');
        //setando o flag de msg de erros para jogos inexistentes para 0.
        $this->_msgErroJogos = 0;
        if($this->adicionaCampeonato() == false)
            echo 'Não existe campeonatos cadastrados no sistema. Adicione campeonatos.';

    }

    //Adiciona um seletor de campeonatos ao form:
    private function adicionaCampeonato()
    {

        if (isset($this->_campeonatoSeletor)) {
            return;
        }

        $this->_campeonatoSeletor = new Zend_Form_Element_Select('s_campeonato',
                                    array('onChange' => 'submit()',));

        $this->_campeonatoSeletor->setLabel('Campeonato')->addMultioption(null, '');

        $listaDeCampeonatos = $this->_campeonatoMapper->fetchAll();
        
        //se existe algum campeonato:
        if(count($listaDeCampeonatos) != 0){

            foreach ($listaDeCampeonatos as $camp) {
                $nome = $camp->getNome();
                //retorna o segundo argumento para o seletor visível ao usuário
                //e o primeiro argumento retorna para o controller.
                $this->_campeonatoSeletor->addMultiOption($nome, $nome);
                $this->addElement($this->_campeonatoSeletor);
            }
            return true;
        } else {
            //não existe campeonatos cadastrados:
            return false;
        }

    }//fim adicionaCampeonato



    //Adiciona um seletor de Jogos:
    private function adicionaJogos()
    {

        if (!isset($this->_jogoSeletor)) {

            $this->_jogoSeletor = new Zend_Form_Element_Select('jogo');

            $this->_jogoSeletor->setLabel('Jogo');

            $this->addElement($this->_jogoSeletor);
        }
    }



    //Adiciona um checkbox para marcar boloes importantes
    private function adicionaSelecionarBolaoImportante ()
    {
        if (!isset($this->_eImportanteCheckBox)) {

            $this->_eImportanteCheckBox = new Zend_Form_Element_Checkbox('eImportante');

            $this->_eImportanteCheckBox->setLabel('Marcar bolão como importante');

            $this->addElement($this->_eImportanteCheckBox);
        }
    }



    //Adicionando botao Criar novo bolão ao Form:
    private function adicionaBotaoNovoBolao($status)
    {
        $this->_novoBolaoBotao = new Zend_Form_Element_Submit('criarBolao');

        $this->_novoBolaoBotao->setLabel('Criar novo bolão')
                          ->setIgnore(true);
        if($status == true) $this->addElement($this->_novoBolaoBotao);


    }


    
    //insere os Jogos na lista correspondente:
    private function populaJogos()
    {

        $this->_jogoSeletor->clearMultiOptions();
        
        //pegando a lista de jogos conforme o campeonato selecionado.
        $listaDeJogos = $this->_jogoMapper->localizarPeloCampeonato($this->getValue('campeonato'));
        
        //existe algum jogo na lista do campeonato selecionado:
        if (count($listaDeJogos) != 0){

            foreach ($listaDeJogos as $umJogo) {
            //pegando as informações relevantes (time A, time B e data):
            $nomeTimeA = $umJogo->getTimeA();
            $nomeTimeB = $umJogo->getTimeB();
            $nomeData = $umJogo->getData();
            //concatenando strings para adicionar ao seletor:
            //as strings ficarão na forma "time A x time B em: data".
            $nomeJogo = $nomeTimeA.' x '.$nomeTimeB.' em: '.$nomeData;
            $idJogo = $umJogo->getId();

            //retorna o segundo argumento para o seletor visível ao usuário
            //e o primeiro argumento retorna para o controller.
            $this->_jogoSeletor->addMultiOption($idJogo, $nomeJogo);
            }

            $this->_jogoSeletor->setValue($this->getValue('jogo'));
            return true;

        } else {
            $this->_jogoSeletor->addMultiOption(0,'Sem jogos para este campeonato');
            $this->_jogoSeletor->setValue(0);
            return false;
        }
    }//fim populaJogos

    private function selecionarCampeonato()
    {        
        $this->_valorCampeonato = new Zend_Form_Element_Hidden('campeonato');
        $this->_valorCampeonato->setValue($this->_campeonatoSeletor->getvalue());
        $this->addElement($this->_valorCampeonato);
    }

    private function prepararCamposExtras($post)
    {
        if (null != $post) {
            $this->populate($post);
        }
        
        $this->selecionarCampeonato();
        $this->adicionaJogos();
        //botao  de criar bolao só aparece se existirem jogos
        //para o campeonato escolhido:
        $botaoSubmitHabilitado = false;        

        if($this->populaJogos() == false){            
            $this->_msgErroJogos++;
        } else {
            $this->adicionaSelecionarBolaoImportante();
            $botaoSubmitHabilitado = true;
            $this->_msgErroJogos = 0;
        }

        $this->adicionaBotaoNovoBolao($botaoSubmitHabilitado);

        if (null != $post) {
            $this->populate($post);
        }

        //Unica forma encontrada para que essa mensagem de erro não
        //surgisse duplicada.
        if($this->_msgErroJogos == 1) {
            echo 'Não há jogos cadastrados para este campeonato. Por favor escolha outro campeonato ou adicione jogos a este.';
        }
    }


    public function isValid ($post)
    {
        //Se o botão de submit foi pressionado, então o post é valido.
        if($this->_novoBolaoBotao->isChecked() == true){
            return true;
        } else {
            //caso contrário, deve-se repopular as listas:
            $this->prepararCamposExtras(null);
            return false;
        } 
    }

}
